<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];


    public function gravatar($size = '100')
    {
        $hash = md5(strtolower(trim($this->attributes['email'])));
        return "http://www.gravatar.com/avatar/$hash?s=$size";
    }



    /*
     * boot  方法会在用户模型类完成初始化之后进行加载，因此我们对事件的监听需要放在该方法中。
     */
    public static function boot()
    {
        parent::boot(); // TODO: Change the autogenerated stub

        static::creating(function ($user){
            $user->activation_token = str_random(30);
        });
    }

    /*
     * 人对微博是一对多关系,
     * 由于一个用户拥有多条微博，因此在用户模型中我们使用了微博动态的复数形式
     *   statuses  来作为定义的函数名
     */
    public function statuses()
    {
       return $this->hasMany(Status::class);
    }
    /*
     *
     */
    public function feed(){
        //return $this->statuses()->orderBy('created_at','desc');
        //给定键获取所有集合值
        $user_ids = $this->followings->pluck('id')->toArray();
        array_push($user_ids, $this->id);
        return Status::whereIn('user_id', $user_ids)
            ->with('user')
            ->orderBy('created_at', 'desc');
    }

    /*
     * 某用户的的粉丝列表
     */
    public function followers()
    {
        //在 Laravel 中会默认将两个关联模型的名称进行合并，并按照字母排序，因此我们生成的关联关系表名称
        //会是  follower_user  。我们也可以自定义生成的名称，把关联表名改为  followers 。
        // belongsToMany  方法的第三个参数  user_id  是定义在关联中的模型外键名，而第四个参数
        // follower_id  则是要合并的模型外键名，此处我们要粉丝列表，那就是follower_id
        return $this->belongsToMany(User::class,'followers','user_id','follower_id');
    }
    /*
     * 某用户关注的用户列表
     * 参数(User::class)1：是最终要获取数据的表模型
     * 参数(followers)2：是与本表与第一个参数表的关联表(本表即指当前模型User对应的users表)
     * 参数(follower_id)3：此参数是foreignPivotKey,是中间表followers针对本表的外键
     * 参数(user_id)4：是relatedPivotKey。related 其实是指User::class表。所以字段其实是中间表followers针对users表的外键
     * 此处我们要用户列表，那就是user_id
     * 参数(employee_id)5:是parentKey。这个是 where 条件中的字段值
     * wherePivot 是中间表 followers 的条件
     */
    public function followings()
    {
       return $this->belongsToMany(User::class,'followers','follower_id','user_id');
    }

    /*
     * 关注某人
     */
    public function follow($user_ids)
    {
        if ( ! is_array($user_ids)) {
            $user_ids = compact('user_ids');
        }
        $this->followings()->sync($user_ids,false);
    }

    /*
     * 取消关注
     */
    public function unfollow($user_ids){
        if ( ! is_array($user_ids)) {
            $user_ids = compact('user_ids');
        }
        return $this->followings()->detach($user_ids);

    }
    /*
     * 是否关注
     *
     */
    public function isFollowing($user_id)
    {
        $res=$this->followings()->where('user_id',$user_id)->count();
       return $res;
    }
}
